perm filename SCANER.SAI[SYS,HE] blob
sn#083091 filedate 1974-01-28 generic text, type C, neo UTF8
COMMENT ⊗ VALID 00009 PAGES
C REC PAGE DESCRIPTION
C00001 00001
C00002 00002 ENTRY XTENT
C00005 00003 ⊃ DDVID OVERLAY CODE
C00007 00004 ⊃ CHANGE CLIP LEVEL MAX. DIFF. AND SET CLIPS TO IT
C00012 00005 ⊃ TEST FOR RASTER SCAN FOR ACOMTEST.
C00018 00006 ⊃ ENTRY TO ACCOMODATE WHEN AN EDGE IS LOST DURING A RASTER SCAN
C00020 00007 ⊃ ENTRY TO ACCOMODATE WHEN AN EDGE IS LOST WHILE TRACING
C00025 00008 ⊃ VERIFIES THAT DETECTED DISCONTINUITY BELONGS TO AN OBJECT EDGE OF
C00029 00009 ⊃ TEST WHETHER I2 (NEXT SCAN POINT) DIFFERS
C00031 ENDMK
C⊗;
ENTRY XTENT;
BEGIN "SCNER" COMMENT ACCOMODATION ROUTINES;
REQUIRE "PREAMB.SAI[SYS,HE]" SOURCE_FILE;
REQUIRE "DPYSUB.HDR[SYS,HE]" SOURCE_FILE;
REQUIRE 500 STRING_SPACE;
EXTERNAL PROCEDURE SENSINIT(BOOLEAN FLAG);
EXTERNAL BOOLEAN PROCEDURE ACC(BOOLEAN PROCEDURE T;BOOLEAN F;INTEGER C,M);
EXTERNAL INTEGER PROCEDURE GETPNT(INTEGER X,Y);
EXTERNAL PROCEDURE INTPNT;
EXTERNAL PROCEDURE TVIN;
EXTERNAL INTEGER PROCEDURE GENTER(INTEGER X,Y; REFERENCE BOOLEAN O;
REFERENCE INTEGER D);
EXTERNAL INTEGER PROCEDURE DDACO(INTEGER DAC);
EXTERNAL INTEGER PROCEDURE YOPER(INTEGER X,Y; REFERENCE INTEGER ANG;
INTEGER CW; STRING TRAC,FLAG);
EXTERNAL PROCEDURE DEBWAIT;
EXTERNAL PROCEDURE DDVID(STRING STR);
EXTERNAL INTEGER PROCEDURE GIOWD(INTEGER ARRAY BUG);
EXTERNAL PROCEDURE OVERL(INTEGER ARRAY BUF;INTEGER N,M,L,EXP;BOOLEAN CHAN);
DEFINE CRLF="'15&'12",⊃="COMMENT", TVRESET="STVFL←0", SAFEX="",
TVX(X)="(X)*3.0-512.0", TVY(Y)="512.0-(Y)*3.0";
EXTERNAL BOOLEAN ACCOMINIT, DEBDEL, DDFLAG, NOWAIT;
EXTERNAL SHORT INTEGER BCLIP, TCLIP, FLINE, LLINE, RSIDE, LSIDE, TMAX,
BMAX, LSMAX, RSMAX, STVFL, IWID, TVCAM, GTHRES, CLDIFF, DEBFRM,
TVWORD, ST, LINLEN;
EXTERNAL STRING JOB;
EXTERNAL REAL OD, OB;
SHORT INTEGER INT,INT2,KKP,CLIPDIF,I1,I2,CW,X2,Y2,DIR,X1,Y1,LENSAV,WIDSAV;
INTERNAL BOOLEAN SCAN_ACC, SCAN_DIR;
BOOLEAN INTOK;
SAFE INTEGER ARRAY DISPL[1:100], BUF[1:10];
SIMPLE PROCEDURE OUTCLIP(STRING LAB);
IF TYP_EDGE THEN
OUTSTR(LAB&" TCLIP="&CVS(TCLIP)&" BCLIP="&CVS(BCLIP)&CRLF);
⊃ CHECK CLIP LEVEL AND ADJUST IF CHANGED;
SIMPLE INTERNAL PROCEDURE REINIT;
IF ABS(TCLIP-BCLIP)<CLIPDIF THEN
BEGIN
TCLIP←(7-CLIPDIF) DIV 2;
BCLIP←TCLIP+CLIPDIF;
TVRESET;
OUTCLIP("REINIT");
END;
⊃ DDVID OVERLAY CODE;
INTERNAL PROCEDURE DDSTART;
IF ST THEN DDVID("E;→1;↔1;F1,1;L0") ELSE
BEGIN SAFE INTEGER ARRAY BUF[1:(((RSMAX-LSMAX+1) DIV 9)+1)*
(BMAX-TMAX+1)];
INTEGER TV,TC,BC,RS,LS,FL,LL;
TV ← TVWORD;
TC ← TCLIP;
BC ← BCLIP;
RS ← RSIDE; LS ← LSIDE; FL ← FLINE; LL ← LLINE;
TVWORD ← GIOWD(BUF);
TCLIP ← 0;
BCLIP ← 7;
RSIDE ← RSMAX; LSIDE ← LSMAX; FLINE ← TMAX; LLINE ← BMAX;
TVIN;
LENSAV ← LINLEN;
WIDSAV ← IWID;
DDVID("E;→1;↔1;F1,1;L0");
TVWORD ← TV;
BC ← BCLIP;
TC ← TCLIP;
RSIDE ← RS; LSIDE ← LS; FLINE ← FL; LLINE ← LL;
END;
INTERNAL SIMPLE PROCEDURE OVERPLT(INTEGER X1, Y1, X2, Y2);
BEGIN
INTEGER RS,LS,FL,LL,LIS,WS,OV;
DPYSET(BUF);
DPYBRT(0);
OV ← OVERLAY;
RS ← RSIDE; LS ← LSIDE; FL ← FLINE; LL ← LLINE;
LIS ← LINLEN;
WS ← IWID;
RSIDE ← RSMAX; LSIDE ← LSMAX; FLINE ← TMAX; LLINE ← BMAX;
OVERLAY ← FALSE;
LINLEN ← LENSAV;
IWID ← WIDSAV;
APT(X1-LSIDE,Y1-FLINE);
IF X2 THEN APT(X2-LSIDE,Y2-FLINE);
DPYPARS;
OVERL(BUF,1,1,0,1,FALSE);
RSIDE ← RS; LSIDE ← LS; FLINE ← FL; LLINE ← LL;
OVERLAY ← OV;
LINLEN ← LIS;
IWID ← WS;
END;
⊃ CHANGE CLIP LEVEL MAX. DIFF. AND SET CLIPS TO IT;
SIMPLE INTERNAL PROCEDURE CLIPCHG(INTEGER DIF);
BEGIN
IF DIF<0 THEN DIF←0;
IF DIF>7 THEN DIF←7;
CLIPDIF ← DIF;
REINIT;
END;
⊃ DEBUGGING ROUTINES;
SIMPLE PROCEDURE SHOW(STRING FOO; INTEGER X1,Y1,X2,Y2,BOOLN);
BEGIN INTEGER DISSAVE;
DISSAVE ← DPYPARS;
DPYSET(DISPL);
DPYBRT(3);
DPYBIG(3);
SETFORMAT(3,0);
IF DEBDEL THEN
BEGIN "DELAY"
AIVECT(-512,400);
DPYSST(FOO&" VALUE="&(IF BOOLN THEN "TRUE" ELSE "FALSE")
&CRLF&"TCLIP="&CVS(TCLIP)&" BCLIP="&CVS(BCLIP)&
CRLF&"DAC="&CVS(DAC_ACC)&" AUTO_ACC ="&
CVS(AUTO_ACC)&CRLF&"INT1="&CVS(I1)&
" INT2="&CVS(I2)&CRLF&"CHANGE= "&
(IF CHANGE_ACC THEN "TRUE" ELSE "FALSE"));
END "DELAY";
APT(TVX(X1),TVY(Y1));
APT(TVX(X2),TVY(Y2));
DPYOUT(DEBFRM);
IF DDFLAG∧¬NOWAIT THEN OVERPLT(X1,Y1,X2,-Y2);
DPYRESET(DISSAVE);
DEBWAIT;
END;
⊃ TEST FOR RASTER SCAN FOR ACOMTEST.
X2, Y2 MUST BE SET BEFORE CALLING;
SIMPLE BOOLEAN PROCEDURE TEST1(REFERENCE SHORT INTEGER A,B);
BEGIN SHORT INTEGER I, J, RET;
IF ¬INTOK THEN
BEGIN
A ← I1 ← GENTER(X1, Y1, J←-1,I);
B ← I2 ← GENTER(X2, Y2, J←-1,I);
END ELSE BEGIN
INTOK←FALSE;
A ← I1;
B ← I2;
END;
RET ← ABS(I1-I2)≥GTHRES∨
((I1 MIN I2)>0∧(I1 MAX I2)<15∧BCLIP-TCLIP≤CLDIFF);
IF DEB_EDGE THEN SHOW("ACCOM-COARSE RASTER",X1,Y1,X2,Y2,RET);
RETURN(RET);
END;
⊃ TEST FOR EDGE TRACING. TRAC, CW MUST BE SET BEFORE CALLING;
SIMPLE BOOLEAN PROCEDURE TEST2(REFERENCE SHORT INTEGER A,B);
BEGIN SHORT INTEGER I,COH;
IF ¬INTOK THEN COH ← YOPER(X1, Y1, DIR, CW, "ACCOM-TRACING",I←0);
INTOK ← FALSE;
A ← OD+.5;
B ← OB+.5;
RETURN(COH=3);
END;
⊃ TEST FOR RASTER SCAN FOR FINEAC. X2, Y2 MUST BE SET BEFORE CALLING;
SIMPLE BOOLEAN PROCEDURE TEST3(REFERENCE SHORT INTEGER A,B);
BEGIN SHORT INTEGER I, J, RET;
IF ¬INTOK THEN
BEGIN
A ← I1 ← GENTER(X1, Y1, J←-1, I);
B ← I2 ← GENTER(X2, Y2, J←-1, I);
END ELSE BEGIN
INTOK ← FALSE;
A ← I1;
B ← I2;
END;
RET ← ABS(I1-I2)≥GTHRES;
IF DEB_EDGE THEN SHOW("ACCOM-FINE RASTER",X1,Y1,X2,Y2,RET);
RETURN(RET);
END;
⊃ ENTRY TO ACCOMODATE WHEN AN EDGE IS LOST DURING A RASTER SCAN;
SIMPLE INTERNAL BOOLEAN PROCEDURE FINEAC(SHORT INTEGER XX,YY,X,Y,INT,INT2);
BEGIN
X1 ← XX;
Y1 ← YY;
X2 ← X;
Y2 ← Y;
I1 ← INT;
I2 ← INT2;
INTOK ← TRUE;
RETURN(ACC(TEST3,TYP_EDGE,CLIPDIF,3));
END;
⊃ ENTRY TO KEEP RASTER INTERSECTION IN BOUNDS;
SIMPLE INTERNAL BOOLEAN PROCEDURE ACOMTEST(REFERENCE SHORT INTEGER INT, INT2;
SHORT INTEGER X,Y,LX,LY);
BEGIN
SHORT INTEGER A, B, C, TST;
A ← TCLIP;
B ← BCLIP;
C ← DAC_ACC;
X1 ← X;
Y1 ← Y;
X2 ← LX;
Y2 ← LY;
I1 ← INT;
I2 ← INT2;
INTOK ← TRUE;
ACC(TEST1,TYP_EDGE,CLIPDIF,3);
INT ← I1;
INT2 ← I2;
IF BCLIP-TCLIP<CLIPDIF THEN
BEGIN
TCLIP ← (TCLIP+BCLIP+CLIPDIF) DIV 2;
BCLIP ← TCLIP+CLIPDIF;
IF BCLIP>7 THEN BEGIN BCLIP←7;TCLIP←7-CLIPDIF;END;
IF TCLIP<0 THEN BEGIN TCLIP←0;BCLIP←CLIPDIF;END;
END;
TST ← A≠TCLIP∨B≠BCLIP∨C≠DAC_ACC;
RETURN(TST);
END;
⊃ ENTRY TO ACCOMODATE WHEN AN EDGE IS LOST WHILE TRACING;
SIMPLE INTERNAL BOOLEAN PROCEDURE ACCOMO(SHORT INTEGER X,Y;
REFERENCE SHORT INTEGER ANGLE,CWX);
BEGIN
BOOLEAN T;
X1 ← X;
Y1 ← Y;
INTOK ← TRUE;
CW ← CWX;
T ← ACC(TEST2,TYP_EDGE,CLIPDIF,5);
ANGLE ← DIR;
RETURN(T);
END;
⊃ VERIFIES THAT DETECTED DISCONTINUITY BELONGS TO AN OBJECT EDGE OF
SUFFICIENT EXTENT THAT ATLEAST 14 POINTS IN A 4*4 RECT. WHOSE UPPER
OR LOWER LEFT HAND CORNER IS THE FIRST POINT THAT DIFFERED FROM THE
BACKGROUND ALSO DIFFER FROM THE BACKGROUND BY AT LEAST AS MUCH. XINCR
IS SIGNED INCREMENT IN X DIRECTION, SIGFLAG IS TRUE IF OBJECT(2ND
SAMPLE IN DIRECTION OF SCAN) IS BRIGHTER THAN BACKGROUND;
DEFINE RSET(X)="BEGIN IF TST THEN
BEGIN
FLINE←XT;
LLINE←XB;
LSIDE←XL;
RSIDE←XR;
TVIN;
END;
RETURN(X);
END";
SIMPLE INTERNAL BOOLEAN PROCEDURE XTENT(SHORT INTEGER X,Y,XINCR;
BOOLEAN SIGFLAG);
BEGIN "XTNT"
SHORT INTEGER K,L,COUNT1,COUNT2, STEPX,T,B,LL,R,XT,XB,XL,XR,TST,
SIDER,SIDEL,LINEF,LINEL,ND,INC;
XT←FLINE; XB←LLINE; XL←LSIDE; XR←RSIDE;
TST←FALSE;
STEPX ← IF SIGFLAG THEN 1 ELSE -1;
B←LINEL←(BMAX-1) MIN (Y+4);
T←LINEF←(Y-4) MAX (TMAX+1);
IF XINCR>0 THEN
BEGIN
INC←1;
LL←SIDEL←(LSMAX+1) MAX (X-XINCR-3);
R←SIDER←(RSMAX-1) MIN (X+3);
END ELSE BEGIN
INC←-1;
R←SIDEL←(RSMAX-1)MIN (X-XINCR+3);
LL←SIDER←(LSMAX+1) MAX (X-3);
END;
COUNT1←COUNT2←INT2←INT←0;
IF B>LLINE∨T<FLINE∨LL<LSIDE∨R>RSIDE THEN
BEGIN
LLINE←B;
FLINE←T;
LSIDE←LL;
RSIDE←R;
TVIN;
TST←TRUE;
INTPNT;
END;
LINEL←LINEL-FLINE;
LINEF←LINEF-FLINE;
SIDEL←SIDEL-LSIDE;
SIDER←SIDER-LSIDE;
ND←SIDEL+INC*3;
FOR K←SIDEL STEP INC UNTIL ND DO
BEGIN
FOR L←LINEF STEP 1 UNTIL LINEF+3 DO
BEGIN
INT←INT+GETPNT(K,L);
COUNT1 ← COUNT1+1;
END;
FOR L←LINEF+5 STEP 1 UNTIL LINEL DO
BEGIN
INT2←INT2+GETPNT(K,L);
COUNT2 ← COUNT2+1;
END;
END;
INT ← INT/COUNT1+.5;
INT2←INT2/COUNT2+.5;
INT ← IF SIGFLAG THEN INT MIN INT2 ELSE INT MAX INT2;
ND←SIDER-INC*3;
COUNT2 ← COUNT1←0;
FOR K←ND STEP INC UNTIL SIDER DO
FOR L←LINEF STEP 1 UNTIL LINEF+3 DO
BEGIN "XT2"
INT2←GETPNT(K,L);
IF ABS(INT2-INT)≥GTHRES THEN COUNT1 ← COUNT1+1;
COUNT2 ← COUNT2+1;
END "XT2";
IF COUNT2-COUNT1<GTHRES THEN RSET(TRUE);
COUNT1 ← COUNT2←0;
FOR K←ND STEP INC UNTIL SIDER DO
FOR L←LINEF+5 STEP 1 UNTIL LINEL DO
BEGIN "XT5"
INT2←GETPNT(K,L) ;
IF ABS(INT2-INT)≥GTHRES THEN COUNT2 ← COUNT2+1;
COUNT1 ← COUNT1+1;
END "XT5";
RSET(COUNT1-COUNT2<3);
END "XTNT";
⊃ TEST WHETHER I2 (NEXT SCAN POINT) DIFFERS
IN THE RIGHT WAY FROM I1 TO AN EXTENT SUFFICIENT
TO CONSTITUTE A POSSIBLE EDGE;
SIMPLE INTERNAL BOOLEAN PROCEDURE DISCON(INTEGER II1,II2,X1,Y1,X2,Y2);
BEGIN "DISCO" INTEGER RET;
I1←II1;
I2←II2;
RET ← ABS(I2-I1)≥GTHRES;
IF DEB_EDGE THEN SHOW("DISCON",X1,Y1,X2,Y2,RET);
RETURN(RET);
END "DISCO";
⊃ CALLED AT START OF RUN;
SIMPLE INTERNAL INTEGER PROCEDURE SCANINIT;
BEGIN "INIT"
IF TVCAM=1 THEN
BEGIN "ACCOM"
IF DAC_ACC<0 THEN DDACO(-DAC_ACC);
SCAN_DIR ← 0;
IF (¬SENSCAL_ACC∨CHANGE_ACC) THEN SENSINIT(TYP_EDGE);
END "ACCOM" ELSE BEGIN
CHANGE_ACC←FALSE;
SENSCAL_ACC←TRUE;
DAC_ACC←AUTO_ACC←30;
END;
TCLIP ← BCLIP ← 5;
CLIPCHG(CLDIFF);
END "INIT";
⊃ INSERT VERIFIER CODE HERE;
DEFINE DISTST="TRUE",
CALL_JOB="JOB",
THIS_JOB="""EDGE""",
DEB_JOB="DEB_EDGE",
TYP_JOB="TYP_EDGE";
REQUIRE "VERIFY.SAI[SYS,HE]" SOURCE_FILE;
END "SCNER";